import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.HashMap;

/**
*
* Classe que implementa a interface RMI, responsável por responder as requições e gernciar a lista de ArquivosLocal compartilhados
*/
public class ServiceImpl extends UnicastRemoteObject implements Service{

    private HashMap<String,ArquivoLocal> listaArquivosLocal;
    
    /**
    *
    * Construtor do serviço, cria a lista de ArquivosLocal, e adiciona o file.txt como teste
    */
    public ServiceImpl() throws RemoteException{
        super();
        this.listaArquivosLocal = new HashMap<String, ArquivoLocal>();
        ArquivoLocal arquivolocal = new ArquivoLocal("file.txt",222222222,"127.0.0.1",null,true);
        this.listaArquivosLocal.put("file.txt", arquivolocal);
    }
    
    /**
    *
    * Envia a lista de ArquivosLocal compartilhados (o arquivo não é enviado, só o registro)
    */
    @Override
    public HashMap<String,ArquivoLocal> obterListaArquivos() throws RemoteException {
        return this.listaArquivosLocal;
    }

    /**
    *
    * Função para o cliente compartilhar um dos seus ArquivosLocal com outros clientes
    */
    @Override
    public boolean compartilharArquivo(ArquivoLocal arquivo) throws RemoteException {
        if (!this.listaArquivosLocal.containsKey(arquivo.getNome())) {
            this.listaArquivosLocal.put(arquivo.getNome(), arquivo);
            return true;
        } else {
            return false;
        }
    }

    /**
    *
    * Função para o cliente descompartilhar um dos seus ArquivosLocal compartilhado com outros clientes
    */
    @Override
    public boolean descompartilharArquivo(ArquivoLocal arquivo) throws RemoteException {
        if (this.listaArquivosLocal.containsKey(arquivo.getNome())) {
            this.listaArquivosLocal.remove(arquivo.getNome());
            return true;
        } else {
            return false;
        }
    }

    /**
    *
    * Função para o cliente atualizar a versão do arquivo que está compartilhado (caso esse foi modificado)
    */
    @Override
    public boolean atualizarArquivo(ArquivoLocal arquivo) throws RemoteException {
        if (this.listaArquivosLocal.containsKey(arquivo.getNome())) {
            ArquivoLocal al = (ArquivoLocal) this.listaArquivosLocal.get(arquivo.getNome());
            al.setVersao(arquivo.getVersao());
            this.listaArquivosLocal.put(al.getNome(), al);
            return true;
        } else {
            return false;
        }
    }

    /**
    *
    * Função para o cliente verificar a versão de um arquivo que está compartilhado, bom para verificar se está com a ultima versão
    */
    @Override
    public long verificarVersaoArquivo(String nome) throws RemoteException {
        if (this.listaArquivosLocal.containsKey(nome)) {
            ArquivoLocal al = (ArquivoLocal) this.listaArquivosLocal.get(nome);
            long versao = (long) al.getVersao();
            return versao;
        } else {
            return 0;
        }        
    }
}
